home *** CD-ROM | disk | FTP | other *** search
/ Resource for Source: C/C++ / Resource for Source - C-C++.iso / codelib1 / v_01_04 / 1n04032a < prev    next >
Encoding:
Text File  |  1995-11-01  |  4.5 KB  |  163 lines

  1. Joe Celko & Michael Smith
  2. Sunset Blvd #304
  3. Los Angeles, CA  90069
  4.   service: (213) 288-9690
  5.  
  6. 325 words
  7.  
  8.  
  9.  
  10.  
  11.  
  12. CHECK DIGIT PROGRAMS 
  13.  
  14. The following Pascal functions will compute the different check 
  15. digits given in the article.  They assume that the program has 
  16. the following declarations global to them.  N can be replaced by 
  17. a literal value in all of the programs for a particular 
  18. application, so these are more templates than programs.  The 
  19. InfoDigits data type assumes that the number to be given a check 
  20. digit is stored in an array of integers, with the leftmost digit 
  21. in position one.
  22.  
  23. CONST 
  24.    N = 10; { size of information digits string }
  25. TYPE
  26.   InfoDigits = ARRAY [1..N] OF INTEGER;
  27.  
  28. FUNCTION MakeCheck(a : InfoDigits; n : INTEGER) : INTEGER;
  29. { This will generate Verhoeff's Dihedral Five check digit }
  30. CONST
  31. MultTable : ARRAY [0..9, 0..9] OF INTEGER =
  32.     (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  33.      ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
  34.      ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
  35.      ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
  36.      ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
  37.      ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
  38.      ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
  39.      ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
  40.      ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
  41.      ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
  42.  
  43. PermTable : ARRAY [0..9, 0..9] OF INTEGER =
  44.        (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  45.         ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
  46.         ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
  47.         ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
  48.         ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
  49.         ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
  50.         ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
  51.         ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
  52.         ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  53.         ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
  54.   
  55. InverseTable : ARRAY [0..9] OF INTEGER =
  56.      ( 0, 4, 3, 2, 1, 5, 6, 7, 8, 9);
  57. VAR
  58.  Check, i : INTEGER;
  59. BEGIN
  60. Check := 0;
  61. FOR i := 1 TO n
  62. DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
  63. MakeCheck := InverseTable[Check];
  64. END;
  65.  
  66. FUNCTION VerifyCheck(a : InfoDigits; n : INTEGER) : BOOLEAN;
  67. { This will verify Verhoeff's Diheral Five check digit.  Note 
  68. that it is different from the generator }
  69. CONST
  70. MultTable : ARRAY [0..9, 0..9] OF INTEGER =
  71.     (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  72.      ( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
  73.      ( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
  74.      ( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
  75.      ( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
  76.      ( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
  77.      ( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
  78.      ( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
  79.      ( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
  80.      ( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
  81.  
  82. PermTable : ARRAY [0..9, 0..9] OF INTEGER =
  83.        (( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  84.         ( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
  85.         ( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
  86.         ( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
  87.         ( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
  88.         ( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
  89.         ( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
  90.         ( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
  91.         ( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
  92.         ( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
  93. VAR
  94.   Check, i : INTEGER;
  95. BEGIN
  96. Check := 0;
  97. FOR i := 1 TO n
  98. DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
  99. VerifyCheck := (Check = 0);
  100. END;
  101.  
  102. .PAGE
  103. Bull Function : 
  104.  
  105. FUNCTION BullCheck(a : InfoDigits; n, x, y : INTEGER) : INTEGER;
  106. {  The most popular pairs (x, y), in order of  increasing error 
  107. detection ability, are (4,5), (4,7), (3,7), (3,5), (5,6) and 
  108. (3,8).  }
  109. VAR
  110.  CheckX, CheckY, i : INTEGER;
  111. BEGIN
  112. CheckX := 0;
  113. CheckY := 0;
  114. FOR i := 1 TO n
  115. DO IF (Odd(i))
  116.    THEN CheckX := CheckX + a[i]
  117.    ELSE CheckY := CheckY + a[i];
  118. BullCheck := (CheckX MOD X)+ (CheckY MOD Y)
  119. END;
  120.  
  121. .PAGE
  122. Power Function : 
  123.  
  124. FUNCTION PowerCheck(a : InfoDigits; base, x : INTEGER) : INTEGER;
  125. { base is usually 2 or 3.  x is usually 7, 10 or 11. }
  126. VAR
  127.  Check, i, Term : INTEGER;
  128. BEGIN
  129. Check := 0;
  130. Term := 1;
  131. FOR i := 1 TO n
  132. DO BEGIN
  133.    Check := Check + (Term * a[i]);
  134.    Term := Term * base;
  135.    END;
  136. PowerCheck := (Check MOD x)
  137. END;
  138.  
  139. .PAGE
  140. ISBN Function : 
  141.  
  142. FUNCTION ISBNCheck(a : InfoDigits) : INTEGER;
  143. VAR
  144.  Check, i : INTEGER;
  145. BEGIN
  146. Check := 0;
  147. FOR i := 1 TO n
  148. DO Check := Check + (i * a[i]);
  149. ISBNCheck := (Check MOD 11)
  150. { Let calling program handle a value of 10
  151.   as it wishes. }
  152. END;
  153.  
  154.                           --END--
  155.  
  156.   Title:  CHECK DIGIT PROGRAMS 
  157.   Words:  325
  158.    Date:  1990 May 02
  159. Sent to:
  160. C Users Journal
  161. R&D Publications
  162. 2601 Iowa Street
  163. Lawrence, KS 66047
  164.